package abg.core.common.ws.handler;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Configuration;

/**
 * 管道初始化器
 */
@Configuration
public class ChannelInit extends ChannelInitializer<SocketChannel> {
    @Resource
    private TextHandler textHandler;

    @Resource
    private BinaryHandler binaryHandler;

    //    @Resource
    //    private MyIdleStateHandler myIdleStateHandler;

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();

        // websocket 基于http协议，所以要有http编解码器
        pipeline.addLast(new HttpServerCodec());
        // 对写大数据流的支持
        pipeline.addLast(new ChunkedWriteHandler());
        // 聚合 HTTP 消息 对httpMessage进行聚合，聚合成FullHttpRequest或FullHttpResponse
        pipeline.addLast(new HttpObjectAggregator(1024 * 1024 * 10));

        // ====================== 以上是用于支持http协议    ======================

        // ====================== 增加心跳支持 start    ======================
        //        pipeline.addLast(new IdleStateHandler(0, 0, 1, TimeUnit.SECONDS));
        //        pipeline.addLast(myIdleStateHandler);

        // ====================== 增加心跳支持 end    ======================

        // ====================== 以下是支持httpWebsocket ======================

        /**
         * websocket 服务器处理的协议，用于指定给客户端连接访问的路由 : /ws
         * 会帮你处理握手动作： handshaking（close, ping, pong） ping + pong = 心跳
         * 对于websocket来讲，都是以frames进行传输的，不同的数据类型对应的frames也不同
         */
        pipeline.addLast(new WebSocketServerProtocolHandler("/websocket/message", null, true, 1024 * 1024 * 10)); // 设置最大帧长度为102400字节

        // 自定义的文字消息处理handler
        pipeline.addLast(textHandler);

        //自定义二进制处理
        //        pipeline.addLast(binaryHandler);

    }
}
